#include "adc.h"


/*******************************************************
*函数名：void ADC1_Init(void)
*功  能：ADC1初始化
*参  数：无
*返  回：无
*备  注：
传感器         引脚    ADC1通道号
 光照          PA3     通道3 
 MQ2烟雾       PA2     通道2
 MQ135有害     PA1     通道1
********************************************************/
void ADC1_Init(void)  
{
//	GPIO_InitTypeDef GPIO_InitStructure;
//	ADC_InitTypeDef  ADC_InitStructure;
//	/* 1.时钟配置 */	
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启PA口的时钟
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//开启ADC1的时钟
//	RCC_ADCCLKConfig(RCC_PCLK2_Div6); //ADC1时钟6分频(小于等于14MHz)
//	/* 2.GPIO配置 */	
//	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
//	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AIN; // 模拟输入                  
//	GPIO_Init(GPIOA, &GPIO_InitStructure);                           
//	/* 3.ADC配置 */
//	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式
//	ADC_InitStructure.ADC_ScanConvMode = DISABLE; //非扫描模式
//	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //单次转换模式
//	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //软件触发启动
//	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
//	ADC_InitStructure.ADC_NbrOfChannel = 1;	//每次转换通道数目
//	ADC_Init(ADC1,&ADC_InitStructure); //初始化ADC1
//	
//	ADC_Cmd(ADC1,ENABLE); //使能ADC
//	ADC_ResetCalibration(ADC1);	//使能复位校准
//	while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束
//	ADC_StartCalibration(ADC1);	//开启AD校准
//	while(ADC_GetCalibrationStatus(ADC1));//等待校准结束
//	
//	//ADC_SoftwareStartConvCmd(ADC1,ENABLE);	
	
	
	
	/*******************************************************************************
*函数的原型：void ADC_Pin_Init(void)
*函数的功能：GPIO初始化
*函数的参数：None
*函数返回值：None
*函数的说明：PA0 ADC1_IN0 模拟输入
*函数编写者：庆
*函数编写日期：2021/2/28
*函数的版本号：V1.0
********************************************************************************/
	
	GPIO_InitTypeDef GPIO_InitStruct;
	ADC_InitTypeDef ADC_InitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//单次转换
	ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据对齐
	ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//独立模式
	ADC_InitStruct.ADC_NbrOfChannel = 1;//转换总数
	ADC_InitStruct.ADC_ScanConvMode = DISABLE;//单通道扫描
	ADC_Init(ADC1,&ADC_InitStruct);
	
	//转换通道 第几次转换 采样时间
	ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5);//
	
	ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);
	
	ADC_Cmd(ADC1,ENABLE);
}



/*******************************************************************************
*函数的原型：u16 ADC_Trans(void)
*函数的功能：ADC读取数据
*函数的参数：None
*函数返回值：
	@ u16：采样50次的平均值
*函数的说明：
*函数编写者：庆
*函数编写日期：2021/2/28
*函数的版本号：V1.0
********************************************************************************/
u16 ADC_Trans(void)
{
	u16 adc_value = 0;
	u8 i = 0;
	
	for(i = 0; i < 50; i++)
	{ 
		//开始转换
		ADC_SoftwareStartConvCmd(ADC1,ENABLE);
		
		//转换是否结束
		while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) != SET);
		adc_value = adc_value + ADC_GetConversionValue(ADC1);//读ADC中的值
	}
	
	return adc_value / 50;
}


///*******************************************************
//*函数名：u16 ADC1_Get(u8 ch)  
//*功  能：按通道号获取AD值
//*参  数：通道号
//*返  回：AD值
//*备  注：
//传感器        引脚    ADC1通道号
//光照          PA3     通道3 
//MQ2烟雾       PA2     通道2
//MQ135有害     PA1     通道1
//********************************************************/
//u16 ADC1_ReadData(u8 ch)     
//{  	
//	ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_1Cycles5);            
//    ADC_SoftwareStartConvCmd(ADC1,ENABLE);	
//	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
//	return ADC_GetConversionValue(ADC1);
//}  


////中值平均滤波
//#define N 10 //采样个数

//u16 ADC1_ReadAvgData(u8 ch)
//{
//	u16 sum=0;
//	u16 ADC1_ValueBuf[N];
//	for(u8 i=0;i<N;i++)
//	{
//		ADC1_ValueBuf[i] = ADC1_ReadData(ch);
//	}
//	//从小到大排列（冒泡法）
//	for(u8 j=0;j<N-1;j++) // 趟数 
//	{
//		for(u8 i=0;i<N-1-j;i++) // 一趟比较的次数 
//		{
//			if(ADC1_ValueBuf[i]>ADC1_ValueBuf[i+1]) // 把最大值往后放 
//			{
//				//交换 
//				u16 temp;
//				temp = ADC1_ValueBuf[i];
//				ADC1_ValueBuf[i] = ADC1_ValueBuf[i+1];
//				ADC1_ValueBuf[i+1] = temp;
//			}
//		}
//	}
//	for(u8 i=2;i<N-2;i++) // 去掉最低两位与最高两位
//	{
//		sum+=ADC1_ValueBuf[i];
//	}
//	return sum/(N-4); // 求平均值
//}



////u16 Light_Data(void)//光照  
////{
////	u16 ad;
////	ad=ADC1_ReadAvgData(3); 		
////	ad=(4095-ad)*1000/4095;
////	return ad;
////}


//u16 MQ2_Data(void)//烟雾 
//{
//	u16 ad;
//	ad=ADC1_ReadAvgData(2); 		
//	ad=ad*100/4095;
//	return ad;
//}



////u16 MQ135_Data(void)//有害气体
////{
////	u16 ad;
////	ad=ADC1_ReadAvgData(1); 		
////	ad=ad*100/4095;
////	return ad;
////}

